package com.wzc.org.service.impl;

import com.wzc.basic.service.impl.BaseServiceImpl;
import com.wzc.org.domain.Department;
import com.wzc.org.mapper.DepartmentMapper;
import com.wzc.org.service.IDepartmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 业务实现类：部门，处理业务
 */
@Service // 交给spring管理
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements IDepartmentService {

    @Autowired // 注解注入mapper
    private DepartmentMapper departmentMapper;



    @Override
    @Transactional
    public void save(Department department) {
        // 返回自增的主键id
        departmentMapper.save(department);
        // 根据父级id判断有无上级部门。
        if (department.getParent_id() == null){ // 没有父级部门
            Long id = department.getId(); // 拿到自己的id
            department.setDirPath("/" + id); // 添加到DirPath
        } else { // 有上级部门
            Long parent_id = department.getParent_id(); // 获取上级部门id
            // 获取上级部门的 dirPath
            String parent_dirPath = departmentMapper.loadById(parent_id).getDirPath();
            // 最后将自己的id拼接到上级部门dirPath后
            department.setDirPath(parent_dirPath + "/" + department.getId());
        }
        update(department); // 更新到数据库

    }

    @Override
    @Transactional
    public void update(Department department) {

        // 根据父级id判断有无上级部门
        if (department.getParent_id() == null){ // 没有父级部门
            Long id = department.getId(); // 拿到自己的id
            department.setDirPath("/" + id); // 添加到DirPath
        } else { // 有上级部门
            Long parent_id = department.getParent_id(); // 获取上级部门id
            // 获取上级部门的 dirPath
            String parent_dirPath = departmentMapper.loadById(parent_id).getDirPath();
            // 最后将自己的id拼接到上级部门dirPath后
            department.setDirPath(parent_dirPath + "/" + department.getId());
        }
        departmentMapper.update(department);

    }

    /**
     * 添加或修改是模态框中上级部门级联选择器数据显示
     * @return
     */
    @Override
    public List<Department> deptTree() {
        // 1. 查询所有
        List<Department> all = departmentMapper.loadAll();

        // 2. 准备一个map
        HashMap<Long, Department> map = new HashMap<>();

        // 3. 把所有数据存放到map中
        for (Department department : all){

            // k: department.getId() 获取部门id，后面子集拿取父级部门
            // v: department 部门对象
            map.put(department.getId(),department);
        }
        // 4. 准备一个list集合存放处理后的数据
        List<Department> deptTree = new ArrayList<>();
        for (Department department : all){
           if(department.getParent_id() == null){  // 判断部门对象是否有父级部门（找出顶级部门）
               deptTree.add(department); // 将顶级部门存放到  部门树
           } else {  // 不是顶级部门，找出它对应的父级部门
               Long parent_id = department.getParent_id(); // 有父级部门，获取父级部门id
               Department parentDepartment = map.get(parent_id); // 从map中通过父级id(k)找到其对应的父级部门(v)
               parentDepartment.getChildren().add(department);  // 将自己存放到父级部门对应的子集部门中
           }
        }
        return deptTree;
    }


}
